import Vue from 'vue'

import Router from 'vue-router'
import store from '@/store'
import mainRoutes from './modules'

// vue-router 更新版本后出现的
// 出现重复跳转（在当前页再跳转当前页）相同路由控制台会报错，这是为了防止报错用了。捕获到就不会控制台报错了
const original = Router.prototype.push
Router.prototype.push = function push(location) {
  // 没有捕获的话会在控制台报错。这里报错还有类型，具体看文档
  return original.call(this, location).catch((err) => err)
}

Vue.use(Router)

const _import =
  process.env.NODE_ENV === 'production'
    ? (file) => () => import('@/views/' + file + '.vue')
    : (file) => require('@/views/' + file + '.vue').default

/**
 * meta参数说明
 * title： 页面标题
 * permission： 进入页面所需权限
 * login：是否需要登录
 * record：是否发送PV记录 (浏览量)
 * home: 是否为主页
 * noNav ：是否需要导航
 * noSearch: 不要头部的搜索按钮
 */

const router = new Router({
  mode: 'history',
  base: process.env.BASE_URL,
  scrollBehavior: () => ({ y: 0 }),
  routes: [
    // {
    //   path: '/login',
    //   component: _import('common/login'),
    //   name: 'login',
    //   meta: { title: '登录' }
    // },
    // {
    //   path: '/register',
    //   component: _import('common/register'),
    //   name: 'register',
    //   meta: { title: '注册' }
    // },
    {
      path: '/',
      component: _import('main/main'),
      name: 'main',
      redirect: { name: 'home' },
      meta: { title: '布局' },
      children: [...mainRoutes]
    },
    { path: '*', redirect: { name: '404' } }
  ]
})

// to.matched当前路由的所有嵌套路由，子父路由的并成一个数组
// to.matched.some(record => record.meta.requiresAuth)

// to 是当前路由
// 路由跳转才会触发
router.beforeEach((to, from, next) => {
  // 页面标题
  // document.title = Vue.prototype.$utils.getDocumentTitle(to.meta.title)
  // 进度条
  Vue.prototype.$loading.start()

  let token = window.localStorage.getItem('token')

  if (token && !store.state.user.init) {
    initUser(to, from, next)
    // Vue.prototype.$loading.done()
  } else if (token && store.state.user.init) {
    next()
  }
  // 需要登录，没有token的情况
  if (to.meta.login && !token) {
    next({ name: 'noPermission' })
  }

  // 没有token但是不需要登陆
  if (!to.meta.login) {
    next()
  }
  sendRecord(to)
  Vue.prototype.$loading.done()

  // if (!to.meta.login) {
  //   next()
  //   Vue.prototype.$loading.done()
  // } else {
  //   if (!token || !/\S/.test(token)) {
  //     Vue.prototype.$utils.clearLoginInfo()
  //     // next({ name: 'login' })
  //   } else {
  //     // if (!store.state.user.init) {
  //     //   initUser(to, from, next)
  //     // }
  //     // else {
  //     //   vaildUser(to, from, next)
  //     // }
  //   }
  //   Vue.prototype.$loading.done()
  // }
})

router.afterEach(() => {
  Vue.prototype.$loading.done()
})

const initUser = (to, from, next) => {
  // 用户权限
  let getPermission = Vue.prototype.$ajax({
    url: Vue.prototype.$ajax.setUrl('/admin'),
    method: 'get',
    params: Vue.prototype.$ajax.setParams()
  })

  // 后端字典，现在暂时不需要
  // let getDict = Vue.prototype.$ajax({
  //   url: Vue.prototype.$ajax.setUrl('sys/sysDict/all'),
  //   method: 'get',
  //   params: Vue.prototype.$ajax.setParams()
  // })
  // 需要用到后端字段再用这个
  // Promise.all([getPermission, getDict]).then((values) => {
  //   if (setPermission(next, values[0]) && setDict(next, values[1])) {
  //     vaildUser(to, from, next)
  //   }
  // }),
  //   () => {
  //     errorFun(next)
  //   }
  Promise.all([getPermission]).then((values) => {
    setPermission(next, values[0])
    // values为then接收的参数
    // if (setPermission(next, values[0])) {
    //   vaildUser(to, from, next)
    // }
  }),
    () => {
      errorFun(next)
    }
}

// /**
//  * 请求到后端字典后，更新字典。这里暂时没有用到，后端设置字典才有用
//  * @param {*} next
//  * @param {*} param1
//  * @returns
//  */
// const setDict = (next, { data }) => {
//   if (data && data.code === '0') {
//     store.commit('common/updateDictList', data.data)
//     return true
//   } else {
//     errorFun(next, data.data || data.msg || '字典信息获取失败')
//     return false
//   }
// }

const setPermission = (next, { data }) => {
  if (data.data && data.code === 0) {
    store.commit('user/updateInit', true)
    store.commit('user/updateId', data.data.id)
    store.commit('user/updateName', data.data.username)
    store.commit('user/updateAvatarKey', data.data.avatar)
    // 后端返回的权限列表，需要权限的页面可以加点权限字段（permission）。这个列表包含的话就证明有这个权限
    // 其实也可以直接判断有登录的话就全部有权限也是可以了。去判断有没有登录就行。
    // store.commit('user/updatePermList', data.data.permissions)
    // store.commit('user/updateDetailInfo', data.data)

    // 这里没有做权限,所以直接跳转就可以了，如果要限制权限的话再开启vaildUser函数吧。
    next()
    return true
  } else {
    errorFun(next, data.data || data.msg || '用户信息获取失败，请稍后重试')
    return false
  }
}

// const vaildUser = (to, from, next) => {
//   if (to.meta.permission) {
//     if (Vue.prototype.$auth(to.meta.permission)) {
//       next()
//     } else {
//       next({ name: 'noPermission' })
//     }
//   } else {
//     next()
//   }
// }

const errorFun = (next, msg = '获取用户信息请求发生了错误') => {
  Vue.prototype.$utils.clearLoginInfo()
  store.commit('user/updateInitText', msg)
}

const sendRecord = (to) => {
  if (to.meta.record) {
    Vue.prototype.$utils.sentRecord(to)
  }
}

export default router
